home *** CD-ROM | disk | FTP | other *** search
/ Power CD / Power CD ATARI-Rechner Lieben.iso / UTILITY / LSRC_222 / HUFST.S < prev    next >
Encoding:
Text File  |  1993-07-28  |  36.6 KB  |  1,761 lines

  1.  
  2.             import error
  3.             import _filbuf
  4.             import outfname
  5.             import InitTree
  6.             import ProcInd
  7.  
  8.             import bsize
  9.             import buffer_gen
  10.             import origsize
  11.             import buffered
  12.             import cmdupdate
  13.             import buffer_last
  14.             import method
  15.             import compsize
  16.  
  17.             export match_length
  18.             export match_position
  19.             export outfile
  20.             export infile
  21.             export blocksize
  22.             export codesize
  23.             export textsize
  24.             export crc
  25.             export crctbl
  26.             export dad
  27.             export lson
  28.             export rson
  29.             export text_buf
  30.             export outrec
  31.             export ship
  32.  
  33.             export buf_putc
  34.             export shipout
  35.             export Decode
  36.             export Encode
  37.             export InsertONode
  38.             export DeleteONode
  39.             export OpenOut
  40.  
  41. DICBIT        set 13
  42. DICSIZ        set (1<<DICBIT)
  43. BUFSIZ        set    16384
  44.  
  45. N            set 4096
  46. F            set 60
  47. THRESHOLD    set 2
  48. N_CHAR        set 256-THRESHOLD+F
  49. T            set N_CHAR*2-1
  50. FOLD        set 18
  51. R            set T-1
  52. NIL            set    N
  53.  
  54. WTERR        set 14
  55.  
  56. outrec:    ds.l    1    ; 0 Speicherzeiger
  57.         ds.l    1    ; 4 Länge
  58.         ds.l    1    ; 8 Basispointer
  59.         ds.l    1    ; 12 basislänge
  60.  
  61. ship:   ds.w    1
  62.  
  63. ferror:    movea.l outfname,A0
  64.         moveq    #WTERR,D0
  65.         moveq.l    #-1,D1
  66.         bra        error
  67.  
  68. buf_putc:
  69.         lea        outrec(pc),a0
  70.         addq.l    #1,codesize-outrec(a0)
  71.  
  72.         move.l    (a0),a1
  73.         move.b    d0,(a1)+
  74.         move.l    a1,(a0)+
  75.         subq.l    #1,(a0)
  76.         bpl.b    _buf_exit
  77.  
  78.         bsr.b    shipout
  79.  
  80. _buf_exit:
  81.         rts
  82.  
  83. shipout:movem.l d0-d2/a0-a2,-(sp)
  84.  
  85.         lea        outrec(pc),a0
  86.         move.l    (a0),d1
  87.         sub.l    8(a0),d1
  88.         beq.b    ship1
  89.  
  90.         move.l    outfile(pc),d0    ; _cnt
  91.         beq.b    ship1
  92.  
  93.         tst.w    cmdupdate
  94.         beq.b    _ship
  95.  
  96.         move.w    ship(pc),d0
  97.         bne.b    _ship
  98.  
  99.         move.l    compsize,d0
  100.         cmp.b    #5,method
  101.         beq.b    lha5
  102.  
  103.         move.l    codesize,d0
  104.  
  105. lha5:    cmp.l    origsize,d0
  106.         blt.b    _ship
  107.  
  108. no_ship:tst.b    buffered
  109.         beq.b    ship1
  110.  
  111.         move.l    buffer_last,d1
  112.         sub.l    8(a0),d1
  113.  
  114. _ship:    move.l    d1,-(sp)
  115.         move.l    8(a0),-(sp)
  116.         move.l    d1,-(sp)
  117.         move.l    outfile(pc),a1
  118.         move.w    14(a1),-(sp)     ; _file
  119.         move.w    #$40,-(sp)
  120.         trap    #1
  121.         lea        12(sp),sp
  122.         move.l    (sp)+,d1
  123.  
  124.         tst.l    d0
  125.         bmi        ferror
  126.  
  127.         cmp.l    d1,d0
  128.         blt        ferror
  129.  
  130. ship1:    clr.b    buffered
  131.  
  132.         lea        outrec(pc),a0
  133.         move.l    12(a0),4(a0)
  134.         move.l    8(a0),(a0)
  135.  
  136.         movem.l (sp)+,d0-d2/a0-a2
  137.         rts
  138.  
  139.         macro    ferror    file
  140.         move.l    file,a0
  141.         move.w    12(a0),d0
  142.         btst    #14,d0
  143.         endm
  144.  
  145.         macro    putc reg
  146.         local    putc1
  147.  
  148.         lea        outrec(pc),a0
  149.         addq.l    #1,codesize
  150.  
  151.         move.l    (a0),a1
  152.         move.b    reg,(a1)+
  153.         move.l    a1,(a0)
  154.         subq.l    #1,4(a0)
  155.         bpl.b    putc1
  156.         bsr        shipout
  157. putc1:
  158.         endm
  159.  
  160.         macro    fputc reg
  161.         local    putc1
  162.         lea        outrec(pc),a0
  163.         move.l    (a0),a1
  164.         move.b    reg,(a1)+
  165.         move.l    a1,(a0)
  166.         subq.l    #1,4(a0)
  167.         bpl.b    putc1
  168.         bsr        shipout
  169. putc1:
  170.         endm
  171.  
  172. OpenOut:lea        outrec(pc),a0
  173.         move.l    buffer_gen,a1
  174.  
  175.         move.l    bsize,d0
  176.         subq.l    #1,d0
  177.  
  178.         move.l    a1,(a0)+
  179.         move.l    d0,(a0)+
  180.         move.l    a1,(a0)+
  181.         move.l    d0,(a0)
  182.         rts
  183.  
  184.         macro    getc
  185.         local    getc1
  186.         local    getc2
  187.         local    getc3
  188.         local    getceof
  189.  
  190.         move.l    infile(pc),a0
  191.         subq.l    #1,(a0)
  192.         bpl.b    getc1
  193.  
  194.         movem.l d1-d2/a0-a1,-(sp)
  195.         jsr        _filbuf
  196.         movem.l (sp)+,d1-d2/a0-a1
  197.  
  198.         cmp.w    #$ffff,d0
  199.         beq.b    getceof
  200.         bra.b    getc2
  201.  
  202. getceof:tst.b    d0
  203.         bra.b    getc3
  204.  
  205. getc1:    moveq.l #0,d0
  206.         move.l    4(a0),a1
  207.         move.b    (a1)+,d0
  208.         move.l    a1,4(a0)
  209.  
  210. getc2:    cmp.b    d0,d0
  211. getc3:
  212.         endm
  213.  
  214.         macro    rgetc
  215.         local    getc1
  216.         local    getc2
  217.  
  218.         subq.l    #1,(a0)
  219.         bpl.b    getc1
  220.  
  221.         movem.l d1-d2/a0-a1,-(sp)
  222.         jsr        _filbuf
  223.         movem.l (sp)+,d1-d2/a0-a1
  224.         bra.b    getc2
  225.  
  226. getc1:    moveq.l #0,d0
  227.         move.l    4(a0),a1
  228.         move.b    (a1)+,d0
  229.         move.l    a1,4(a0)
  230. getc2:
  231.         endm
  232.  
  233.         macro    getw
  234.         local    Fits
  235.         local    getwEnd
  236.  
  237.         rgetc
  238.         move.w    d0,d7
  239.         lsl.w    #8,d7
  240.         rgetc
  241.         move.b    d0,d7
  242. getwEnd:endm
  243.  
  244.         macro    crcgetc
  245.         local    no_crc
  246.  
  247.         lea        crc,A1
  248.  
  249.         move.w    (A1)+,D1    ; A1 -> crctbl
  250.         move.w    d1,d2
  251.         eor.w    D0,D1
  252.  
  253.         and.w    #$ff,D1
  254.         add.w    D1,D1
  255.  
  256.         lsr.w    #8,D2
  257.         move.w    0(A1,D1.w),D1
  258.         eor.w    D2,D1
  259.         move.w    D1,-(A1)    ; crc
  260.         endm
  261.  
  262.         macro    putcode
  263.         local    PutCode1
  264.         local    PutCode2
  265.         movem.w D3/D4,-(SP)
  266.         move.w    D0,D4
  267.         move.w    D1,D3
  268.         move.b    d7,D2
  269.         lsr.w    D2,D1
  270.         or.w    D1,d6
  271.  
  272.         add.b    D0,d7
  273.         cmpi.b    #8,d7
  274.         bcs.b    PutCode2
  275.  
  276.         move.w    d6,D0
  277.         lsr.w    #8,D0
  278.         putc    d0
  279.  
  280.         subq.b    #8,d7
  281.         cmpi.b    #8,d7
  282.         bcs.b    PutCode1
  283.  
  284.         putc    d6
  285.  
  286.         subq.b    #8,d7
  287.  
  288.         move.w    D3,D0
  289.         move.b    D4,D1
  290.         sub.b    d7,D1
  291.         lsl.w    D1,D0
  292.         move.w    D0,d6
  293.         bra.b    PutCode2
  294.  
  295. PutCode1:
  296.         move.w    d6,D0
  297.         lsl.w    #8,D0
  298.         move.w    D0,d6
  299.  
  300. PutCode2:
  301.         move.w  (sp)+,D3
  302.         move.w    (sp)+,D4
  303.         endm
  304.  
  305. reconst:movem.l D0-A6,-(SP)
  306.         lea        freq,A0
  307.         lea        prnt-freq(a0),A1
  308.         lea        son-freq(a0),A2
  309.         bra.b    rcon_a
  310.  
  311. rcon:    movem.l D0-A6,-(SP)
  312. rcon_a: moveq    #0,D0
  313.         moveq    #0,D1
  314. ; Collect leaf nodes in the first half of the table
  315. ; and relace the freq by (freq+1)/2
  316. rcon1:    cmpi.w    #2*T,0(A2,D1.w) ; if son[i] >= T
  317.         blt.b    rcon2
  318.         moveq    #1,D2
  319.         add.w    0(A0,D1.w),D2
  320.         lsr.w    #1,D2
  321.         move.w    D2,0(A0,D0.w)    ; freq[j] = (freq[i]+1)/2
  322.         move.w    0(A2,D1.w),0(A2,D0.w) ; son[j]=son[i]
  323.         addq.w    #2,D0        ; j++
  324. rcon2:        addq.w    #2,D1        ; i++
  325.         cmp.w    #2*T,D1     ; i < T
  326.         blo.b    rcon1
  327.  
  328. ; begin constructing tree by connecting sons
  329. ; for (i=0; j=N_CHAR; j < T; i+=2; j++) {
  330.  
  331.         move.w    #N_CHAR*2,D3
  332.         moveq    #0,D4
  333. rcon3:        moveq    #2,D0
  334.         add.w    D4,D0        ;        k=i+2
  335.         move.w    0(A0,D4.w),D6
  336.         add.w    0(A0,D0.w),D6    ; f=freq[i]+freq[k]
  337.         move.w    D6,0(A0,D3.w)    ; freq[j]=f
  338. ; for (k=j-1; f < freq[k]; k--);
  339.         moveq    #-2,D5
  340.         add.w    D3,D5
  341.         bra.b    rcon5
  342. rcon4:        subq.w    #2,D5
  343. rcon5:        cmp.w    0(A0,D5.w),D6
  344.         blo.b    rcon4
  345.  
  346.         addq.w    #2,D5
  347.         move.w    D3,D7
  348.         sub.w    D5,D7        ; l=(j-k) * 2
  349.  
  350.         lea    0(A0,D5.w),A3
  351.         bsr.b    movemem     ;nach oben schieben
  352.         move.w    D6,0(A0,D5.w)    ; freq[k]= f
  353.  
  354.         lea    0(A2,D5.w),A3
  355.         bsr.b    movemem
  356.  
  357.         move.w    D4,0(A2,D5.w)    ; son[k] = i
  358.  
  359.         addq.w    #4,D4        ; i+=2
  360.         addq.w    #2,D3        ; j++
  361.         cmp.w    #2*T,D3
  362.         blo.b    rcon3
  363.  
  364. ; connect prnt
  365. ; for (i=0; i<T; i++) {
  366.         moveq    #0,D0
  367. rcon6:        move.w    0(A2,D0.w),D1
  368.         move.w    D0,0(A1,D1.w)
  369.         cmp.w    #2*T,D1
  370.         blt.b    rcon7        ; if ((k=son[j]) >= T) {
  371.         move.w    D0,0(A1,D1.w)    ; prnt[k] = i
  372.         bra.b    rcon8
  373. rcon7:        move.w    D0,0(A1,D1.w)    ; prnt[k] = i
  374.         move.w    D0,2(A1,D1.w)    ; prnt[k+1] = i;
  375. rcon8:        addq.w    #2,D0
  376.         cmp.w    #2*T,D0
  377.         blo.b    rcon6
  378.         movem.l (SP)+,D0-A6
  379.         rts
  380.  
  381. movemem:    adda.w    D7,A3
  382.         lea    2(A3),A4
  383.         move.w    D7,D0
  384.         bra.b    movemem2
  385. movemem1:    move.w    -(A3),-(A4)
  386.         subq.w    #2,D0
  387. movemem2:    bne.b    movemem1
  388.         rts
  389. ; -----------------------------------------------------------------------
  390. ;        update
  391. ; -----------------------------------------------------------------------
  392.  
  393.  
  394. ; void update(int c);
  395. ; register int i,j,k,l;
  396. ; register D3 = c
  397. ; register D1 = k
  398. ; register D2 = l
  399. ; register A1 = son
  400.  
  401. ; register D5 = cardinal c
  402. ; a4 = freq[c]
  403.  
  404. ;uses: d0,d1,d2,d5
  405. ;       a0,a1,a2,a3,a4,a6
  406. ; expects:     a2 = freq        d2 = 2*T
  407. ;           a4 = son
  408.         macro    update
  409.         local    upd_1
  410.         local    upd_2
  411.         local    upd_2a
  412.         local    upd_2b
  413.         local    upd_3
  414.         local    upd_4
  415.         local    upd_5
  416.         local    upd_6
  417.         local    updx
  418.         local    updx1
  419.         local    updrecon
  420.  
  421.         tst.w    R*2(A2)  ; if freq[R] == MAX_FREQ
  422.         bmi        updrecon
  423.  
  424. upd_1:    lea    prnt-freq(a2),A0     ; A0 = prnt
  425.  
  426.         move.w    0(a0,d0.w),d0
  427. ; do {
  428.         lea    0(A2,d0.w),A1    ; A1 = freq[c]
  429.         addq.w    #1,(A1)     ; freq[c]++
  430.  
  431. ; Ab hier: l=d5
  432. ; if the order is disturbed, exchange nodes
  433.         cmpm.w    (A1)+,(a1)+    ; if k>freq[l=c+1])
  434.         bcs.b    upd_2b
  435.  
  436. upd_2a:     move.w    0(a0,d0.w),d0
  437.         beq.b    updx
  438. ; do {
  439. upd_2:        lea    0(A2,d0.w),A1    ; A1 = freq[c]
  440.         addq.w    #1,(A1)     ; freq[c]++
  441.  
  442. ; Ab hier: l=d5
  443. ; if the order is disturbed, exchange nodes
  444.         cmpm.w    (A1)+,(a1)+    ; if k>freq[l=c+1])
  445.         bcc.b    upd_2a
  446.  
  447. ; while k > freq[++l]
  448. upd_2b:     subq.w    #1,-4(a1)
  449.         move.w    -4(a1),d1
  450. upd_3:        cmp.w    (a1)+,D1
  451.         beq.b    upd_3        ; while (k>freq[++l]);
  452.         subq.l    #4,a1
  453.         addq.w    #1,(a1)
  454.  
  455.         sub.l    A2,a1
  456.  
  457.         move.w    0(a4,d0.w),d4    ; i=son[c]
  458.         move.w    a1,(a0,d4.w)    ;prnt[i]=l
  459.  
  460.         cmp.w    d2,d4            ; if i<T
  461.         bge.b    upd_4
  462.         move.w    a1,2(A0,d4.w)    ; prnt[i+1]=l
  463.  
  464. upd_4:        move.w    0(A4,a1.w),D1           ; j=son[l]
  465.         move.w    d4,0(A4,a1.w)        ; son[l]=j
  466.  
  467.         move.w    d0,(A0,d1.w)    ; prnt[j] = c
  468.  
  469.         cmp.w    d2,D1            ; if j<T
  470.         bge.b    upd_5
  471.         move.w    d0,2(A0,d1.w)    ; prnt[j+1]=c
  472.  
  473. upd_5:        move.w    D1,0(a4,d0.w)    ; son[c]=j
  474.         move.w    a1,d0
  475. upd_6:        move.w    0(a0,d0.w),d0
  476.         beq.b    updx1
  477. ; do {
  478.         lea    0(A2,d0.w),A1    ; A1 = freq[c]
  479.         addq.w    #1,(A1)     ; freq[c]++
  480. ;         move.w    (A1)+,D1      ; k=freq[c]
  481.  
  482. ; Ab hier: l=d5
  483. ; if the order is disturbed, exchange nodes
  484.         cmp.w    (A1)+,(a1)+    ; if k>freq[l=c+1])
  485.         bcc.b    upd_6
  486.         bra.b    upd_2b
  487. ; while k > freq[++l]
  488. updrecon:    bsr    reconst
  489.         bra    upd_1
  490. updx1:
  491. updx:
  492.         endm
  493.  
  494. ; -----------------------------------------------------------------------
  495. ;         EncodeChar
  496. ; -----------------------------------------------------------------------
  497.  
  498. ; void EncodeChar(unsigned c);
  499. ; register unsigned i;
  500. ; register int j,k;
  501. ; D5 = c
  502. ; D3 = i
  503. ; d4 = j
  504. ; d0 = k
  505.         macro    EncodeCh
  506.         local    Enchar1
  507.         local    Enchar2
  508.         local    Enchar3
  509.         local    Enchar4
  510.         local    Enchar5
  511.         local    Enchar6
  512.         move.w    d5,-(SP)
  513.         move.w    #2*R,d2
  514.         move.w    D0,D5        ; c
  515.         moveq    #0,D1        ;i=0
  516.         move.l    d1,a1        ;j=0
  517.         moveq    #0,d4        ;shift=0
  518.         lea        prnt,A0
  519.         add.w    #T,D0        ; T
  520.         add.w    D0,D0
  521.         move.w    0(A0,D0.w),D0    ; k=prnt[c+T]
  522. ; while
  523. ; if (k & 1) i +=0x8000
  524. Enchar1:    addq.w    #1,d4
  525.         btst    #1,D0
  526.         beq.b    Enchar2
  527.         lsr.w    d4,d1
  528.         add.w    d4,a1
  529.         moveq    #0,d4
  530.         add.w    #$8000,d1
  531. Enchar2:    move.w    0(A0,D0.w),D0    ; k=prnt[k]
  532.         cmp.w    d2,D0            ; R
  533.         bne.b    Enchar1
  534.  
  535. ; putcode(j,i)
  536. Enchar5:add.w    d4,a1
  537.         move.w    a1,D0
  538.         lsr.w    d4,d1
  539.         lea        freq,a2
  540.         putcode
  541. ; update(c)
  542.         move.w    D5,D0
  543.         add.w    D0,D0
  544.         lea        freq,a2
  545.         lea        son-freq(A2),a4
  546.         move.w    #2*T,D2
  547.         add.w    d2,d0
  548.         update
  549.         move.w    (SP)+,D5
  550.         endm
  551.  
  552. ; void EncodePosition(unsigned c)
  553. ; register unsigned i;
  554.  
  555.         macro    EncodePo
  556.         move.w    D0,d4
  557.  
  558.         lsr.w    #6,D0
  559.         move.w    D0,D2        ; i = c >> 6
  560.  
  561.         lea        p_code(pc),A0
  562.         moveq    #0,D1
  563.         move.b    0(A0,D2.w),D1
  564.         lsl.w    #8,D1        ; p_code[i] << 8
  565.  
  566. ;         lea     p_len,A1
  567.         moveq    #0,D0
  568.         move.b    p_len-p_code(A0,D2.w),D0    ; p_len[i]
  569.         putcode         ; putcode(p_len[i],p_code[i] <<8)
  570.  
  571.         moveq    #$3F,D1
  572.         and.w    d4,D1
  573.         moveq    #$0A,D0
  574.         lsl.w    D0,D1
  575.         moveq    #6,D0
  576.         putcode
  577.         endm
  578.  
  579. ; void DeleteNode(int p);        D5 = P
  580. ; register int q;
  581.  
  582. ; register D5 = p    ; D4 = cardinal p
  583. ; register D1 = q    ; D2 = cardinal q
  584. ; register D3 = temp
  585.  
  586. ; register A0 = dad
  587. ; register A2 = rson
  588. ; register A3 = lson
  589. ; register A4 = *rson[p]
  590. ; register A5 = *lson[p]
  591.  
  592.  
  593. ; WARNING: THE FOLLOWING REGISTERS MUST BE DEFINED:
  594. ;
  595. ; A2 = lson
  596. ; A3 = rson
  597. ; a4 = dad
  598. ; A5 = text_buf
  599.  
  600.         macro    DeleteNo
  601.         local    DNode_1
  602.         local    DNode_2
  603.         local    DNode_3
  604.         local    DNode_4
  605.         local    DNode_5
  606.         local    DNode_6
  607.         local    DNode_7
  608.         local    DNode_8
  609.         local    DNode_9
  610.         local    DNodex1
  611.         local    DNodex2
  612.         move.w    #2*NIL,D7
  613.         cmp.w    0(a4,d5.w),d7    ; if dad[p] == NIL
  614.         beq.b    DNode_9         ;     return
  615.         cmp.w    0(A3,d5.w),d7    ; if rson[p] == NIL
  616.         beq.b    DNodex1
  617.         move.w    0(a2,d5.w),d2
  618.         cmp.w    d2,d7            ; if lson[p] == NIL
  619.         beq.b    DNodex2
  620. DNode_2:
  621.         move.w    0(a3,d2.w),d1
  622.         cmp.w    d1,d7
  623.         beq.b    DNode_5
  624. ; do { q=rson[q] } while (rson[q] != NIL}
  625. DNode_3:
  626.         move.w d2,d1
  627.         move.w    0(A3,D2.w),D2
  628.         cmp.w    D7,D2
  629.         bne.b    DNode_3
  630.         move.w    d1,d2
  631. DNode_4:
  632. ; d2 = q    |  d5 = p     |  d1/d0 = temp |
  633. ; a2 = lson |  a3 = rson |    a4      = dad    |
  634.  
  635.         move.w    0(a2,d2.w),d0        ; lson[q]
  636.         move.w    0(a4,d2.w),d1        ; dad[q]
  637.         move.w    d0,0(a3,d1.w)        ; rson[dad[q]]=lson[q]
  638.         move.w    d1,0(a4,d0.w)        ; dad[lson[q]]=dad[q]
  639.         move.w    0(a2,d5.w),d1        ; lson[p]
  640.         move.w    d1,0(a2,d2.w)        ; lson[q]=lson[p]
  641.         move.w    d2,0(a4,d1.w)        ; dad[lson[p]]=q
  642.  
  643. DNode_5:
  644.         move.w    (a3,d5.w),d0
  645.         move.w    d0,0(A3,D2.w)        ; rson[q] = rson[p]
  646.         move.w    D2,0(A4,d0.w)        ; dad[rson[p]] = q
  647. DNode_6:
  648.         move.w    0(a4,d5.w),d0        ; dad[p]
  649.         move.w    d0,0(A4,D2.w)         ; dad[q]=dad[p]
  650.  
  651.         cmp.w    0(A3,d0.w),D5
  652.         bne.b    DNode_7             ; if rson[dad[p]]=p
  653. ; else ..
  654.         move.w    D2,0(A3,d0.w)        ; rson[dad[p]]=q
  655.         bra.b    DNode_8
  656. DNodex1:
  657.         move.w    0(a2,d5.w),d2        ; q=lson[p]
  658.         bra.b    DNode_6
  659. DNodex2:
  660.         move.w    0(a3,d5.w),d2        ; q=rson[p]
  661.         bra.b    DNode_6
  662. DNode_7:move.w    D2,0(A2,d0.w)        ; lson[dad[p]]=q
  663. DNode_8:move.w    D7,0(a4,d5.w)
  664. DNode_9:
  665.         endm
  666.  
  667. ; -----------------------------------------------------------------------
  668. ;        InsertNode
  669. ; -----------------------------------------------------------------------
  670.  
  671. ; void InsertNode(int r);
  672. ; rester int i,p,cmp;
  673. ; unsigned char *key;
  674. ; unigned c;
  675.  
  676. ; register D1 = cmp
  677. ; register D2 = p
  678. ; register A1 = *key
  679. ; register a2 = rson
  680. ; register A3 = lson
  681.  
  682. ; WARNING: THE FOLLOWING REGISTERS MUST BE DEFINED:
  683. ;
  684. ; A2 = lson
  685. ; A3 = rson
  686. ; A4 = dad
  687.  
  688.  
  689.         macro    InsertNo
  690.         local    INode_1
  691.         local    INode_1a
  692.         local    INode_2
  693.         local    INode_3
  694.         local    INode_3a
  695.         local    INode_4
  696.         local    INode_6
  697.         local    INode_6e1
  698.         local    INode_6odd
  699.         local    INode_7
  700.         local    INode_8
  701.         local    INode_9
  702.         local    INode_10
  703.         local    INode_11
  704.         local    INode_12
  705.         local    INode_14
  706.         local    Encode_L1
  707.         movem.l a6/d3,-(sp)
  708.  
  709.         move.w    d6,d1
  710.         lea    0(A5,D1.w),A1    ; key=&text_buf[r]
  711.  
  712.         move.w    (A1)+,D2    ; key[0]
  713.         add.w    #N+1,D2     ; p= N+1+key[0]
  714.         add.w    D2,D2        ; cardinal
  715.         move.w    #2*NIL,d3
  716.         move.w    d3,0(A2,D1.w)    ; rson[r] = NIL
  717.         move.w    d3,0(A3,D1.w)    ; lson[r] = NIL
  718.  
  719. ; for ...
  720. ;        move.l    dad(pc),A4
  721. INode_1a:    move.w    d2,a6
  722.         move.w    0(A3,D2.w),d2    ; rson[p]
  723.         cmp.w    d3,d2        ; if rson[p] != NIL
  724.         bne.b    INode_6     ; p=rson[p] else
  725.  
  726. INode_2:    move.w    a6,d2
  727.         move.w    D1,0(a3,d2.w)    ; rson[p] = r
  728.         move.w    D2,0(A4,D1.w)    ; dad[r] = p
  729.         bra    INode_14
  730.  
  731. INode_4:    move.w    a6,d2
  732.         move.w    D1,0(a2,d2.w)    ; lson[p] = r
  733.         move.w    D2,0(A4,D1.w)    ; dad[r] = p
  734.         bra    INode_14
  735. INode_3a:    bge.b    INode_1a
  736. INode_3:    move.w    d2,a6
  737.         move.w    0(A2,D2.w),d2    ; d2=lson[p]
  738.         cmp.w    d3,d2        ; if lson[p] != NIL
  739.         beq.b    INode_4
  740.  
  741. ; for (i=1; i<F; i++)
  742. INode_6:    move.l    a1,A0        ; key[1] (Siehe oben (a0)+)
  743.         lea    2(A5,D2.w),A6    ; text_buf[p+1]
  744.         cmpm.w    (a0)+,(a6)+    ; this saves MUTCH time
  745.         bne.b    INode_3a    ; and also (why?) some bytes
  746.         cmpm.l    (a0)+,(a6)+
  747.         bne.b    INode_3a
  748.  
  749.         rept    20
  750.         cmpm.l    (a0)+,(a6)+
  751.         bne.b    INode_8
  752.         endm
  753.         moveq    #7,D0
  754. INode_7:    cmpm.l    (A0)+,(A6)+
  755.         dbne    D0,INode_7
  756.  
  757. INode_8:    beq.b    INode_10
  758.         bhi.b    INode_3
  759.         move.w    d2,a6
  760.         move.w    0(A3,D2.w),d2    ; rson[p]
  761.         cmp.w    d3,d2        ; if rson[p] != NIL
  762.         bne.b    INode_6     ; p=rson[p] else
  763.  
  764.         move.w    a6,d2
  765.         move.w    D1,0(a3,d2.w)    ; rson[p] = r
  766.         move.w    D2,0(A4,D1.w)    ; dad[r] = p
  767.         bra    INode_14
  768. Encode_L1:    move.w    D1,0(A3,d0.w)
  769.         move.w    d3,0(a4,d2.w)    ; dad[p] = NIL
  770.         bra.b    INode_14
  771. ;  break
  772. INode_10:    ; d2 = p     a2 = lson     a4 = dad
  773.         ; d1 = r     a3 = rson
  774.         move.w    0(a2,d2.w),d0        ; d0 = lson[p]
  775.         move.w    d1,0(a4,d0.w)        ;    dad[lson[p]]=r
  776.         move.w    d0,0(a2,d1.w)        ;    lson[r]=lson[p]
  777.         move.w    0(a3,d2.w),d0        ; d0=rson[p]
  778.         move.w    d1,0(a4,d0.w)        ;    dad[rson[p]]=r
  779.         move.w    d0,0(a3,d1.w)        ;    rson[r]=rson[p]
  780.         move.w    0(a4,d2.w),d0        ; dad[r]=dad[p]
  781.         move.w    d0,(a4,d1.w)
  782.         cmp.w    0(A3,d0.w),D2
  783.         beq.b    Encode_L1
  784.         move.w    D1,0(A2,D0.w)        ; lson[dad[p]] = r
  785. INode_12:    move.w    d3,0(a4,d2.w)        ; dad[p] = NIL
  786. INode_14:
  787.         movem.l (sp)+,a6/d3
  788.         endm
  789.  
  790.         macro    MatchInsertNo
  791.         local    INode_1
  792.         local    INode_1a
  793.         local    INode_2
  794.         local    INode_3
  795.         local    INode_3a
  796.         local    INode_4
  797.         local    INode_6
  798.         local    INode_7
  799.         local    INode_8
  800.         local    INode_9
  801.         local    INode_9a
  802.         local    INode_10
  803.         local    INode_12
  804.         local    INode_14
  805.         local    Encode_L1
  806.         pea        (a6)
  807.         movem.w D3-D5,-(SP)
  808.         moveq    #1,D1        ; cmp=1
  809.         move.w    #2*NIL,d5
  810. ;         add.w     D6,D6
  811.         lea    0(A5,D6.w),A1    ; key=&text_buf[r]
  812.  
  813.         move.w    (A1)+,D2    ; key[0]
  814.         add.w    #N+1,D2     ; p= N+1+key[0]
  815.         add.w    D2,D2        ; cardinal
  816.  
  817.         move.w    D5,0(A2,D6.w)    ; rson[r] = NIL
  818.         move.w    D5,0(A3,D6.w)    ; lson[r] = NIL
  819.  
  820. ; match_position=d7
  821. ; match_length=d0
  822.         moveq    #0,d0        ; match_length=0
  823. ;         clr.w     match_length-lson(a2)      ; match_length=0
  824. ; for ...
  825. ;        move.l  dad(pc),A4
  826. INode_1:    tst.b    D1        ; if (cmp > 0) {
  827.         blt.b    INode_3
  828. INode_1a:    move.w    d2,a6
  829.         move.w    0(A3,D2.w),d2    ; rson[p]
  830.         cmp.w    d5,d2        ; if rson[p] != NIL
  831.         bne.b    INode_6     ; p=rson[p] else
  832.  
  833. INode_2:    move.w    a6,d2
  834.         move.w    D6,0(a3,d2.w)    ; rson[p] = r
  835.         move.w    D2,0(A4,D6.w)    ; dad[r] = p
  836.         bra    INode_14
  837.  
  838. INode_4:    move.w    a6,d2
  839.         move.w    D6,0(a2,d2.w)    ; lson[p] = r
  840.         move.w    D2,0(A4,D6.w)    ; dad[r] = p
  841.         bra    INode_14
  842. INode_3a:    bge.b    INode_1a
  843. INode_3:    move.w    d2,a6
  844.         move.w    0(A2,D2.w),d2    ; d7=lson[p]
  845.         cmp.w    d5,d2        ; if lson[p] != NIL
  846.         beq.b    INode_4
  847.  
  848. ; for (i=1; i<F; i++)
  849. INode_6:    move.l    a1,A0        ; key[1] (Siehe oben (a0)+)
  850.         lea    2(A5,D2.w),A6    ; text_buf[p+1]
  851.         cmpm.l    (a0)+,(a6)+    ; this saves MUTCH time
  852.         bne.b    INode_3a    ; and also (why?) some bytes
  853.         cmpm.w    (a0)+,(a6)+
  854.         bne.b    INode_3a
  855.         moveq    #F-5,D3
  856. INode_7:    cmpm.w    (A0)+,(A6)+
  857.         dbne    D3,INode_7
  858.  
  859. INode_8:    beq    INode_9a
  860.         shi    d1        ; cmp=key[i]-text_buf[p+1]
  861.         not    d3
  862.         add.w    #F,d3
  863.  
  864.         cmp.w    d0,D3        ; if i>match_length
  865.         ble.b    INode_1
  866. INode_9:    move.w    D6,D7
  867.         sub.w    D2,D7        ; r-p
  868.         and.w    #2*$0FFF,D7      ; (r-p) & (N-1)
  869.         subq.w    #2,D7        ; ((r-p) & (N-1)) -1 = match_pos
  870.  
  871.         move.w    D3,d0        ; match_length=i
  872.         tst.b    D1        ; if (cmp > 0) {
  873.         blt    INode_3
  874.         move.w    d2,a6
  875.         move.w    0(A3,D2.w),d2    ; rson[p]
  876.         cmp.w    d5,d2        ; if rson[p] != NIL
  877.         bne.b    INode_6     ; p=rson[p] else
  878.  
  879.         move.w    a6,d2
  880.         move.w    D6,0(a3,d2.w)    ; rson[p] = r
  881.         move.w    D2,0(A4,D6.w)    ; dad[r] = p
  882.         bra    INode_14
  883. INode_9a:    not    d3
  884.         add.w    #F,d3
  885.         move.w    D6,D7
  886.         sub.w    D2,D7        ; r-p
  887.         and.w    #2*$0FFF,D7      ; (r-p) & (N-1)
  888.         subq.w    #2,D7        ; ((r-p) & (N-1)) -1 = match_pos
  889.  
  890.         move.w    D3,d0        ; match_length=i
  891. ;  break
  892. INode_10:
  893.         move.w    0(a2,d2.w),d4        ; d4 = lson[p]
  894.         move.w    d6,0(a4,d4.w)        ;    dad[lson[p]]=r
  895.         move.w    d4,0(a2,d6.w)        ;    lson[r]=lson[p]
  896.         move.w    0(a3,d2.w),d4        ; d4=rson[p]
  897.         move.w    d6,0(a4,d4.w)        ;    dad[rson[p]]=r
  898.         move.w    d4,0(a3,d6.w)        ;    rson[r]=rson[p]
  899.         move.w    0(a4,d2.w),d4
  900.         move.w    d4,0(a4,d6.w)        ; dad[r]=dad[p]
  901.  
  902.         cmp.w    0(A3,D4.w),D2
  903.         beq.b    Encode_L1
  904.  
  905.         move.w    D6,0(A2,D4.w)    ; lson[dad[p]] = r
  906.  
  907. INode_12:
  908.         move.w    d5,0(a4,d2.w)    ; dad[p] = NIL
  909.         bra.b    INode_14
  910. Encode_L1:
  911.         move.w    D6,0(A3,D4.w)
  912.         move.w    d5,0(a4,d2.w)    ; dad[p] = NIL
  913. INode_14:
  914.         move.w    d0,match_length
  915.         move.w    d7,match_position
  916.         move.w  (sp)+,d3
  917.         move.w    (sp)+,d4
  918.         move.w    (sp)+,d5
  919.         move.l    (sp)+,a6
  920.         endm
  921.  
  922. ; -----------------------------------------------------------------------
  923. ;        StartHuff
  924. ; -----------------------------------------------------------------------
  925.  
  926.  
  927. StartHuf:
  928.         movem.l D3-D4/A2-A3,-(SP)
  929.         lea        freq,A0
  930.         movea.l A0,A1        ; freqp=freq
  931.         lea        son,A2        ; sonp=son
  932.         lea        2*T+prnt,A3    ; prnpt=&prntp[T]
  933. ; for(i=0; i<N_CHAR; i++) {
  934.         move.w    #2*T,D1     ; iT=T
  935.         moveq    #0,D4
  936.         moveq    #0,D0           ; i=0
  937.         bra.b    SHuff2
  938. SHuff1: move.w    #1,(A1)+    ; *freq++=1
  939.         move.w    D1,(A2)+    ; *sonp++=iT++
  940.         addq.w    #2,D1
  941.         move.w    D4,(A3)+    ; *prntp++=i;
  942.         addq.w    #1,D0
  943.         addq.w    #2,D4
  944. SHuff2: cmp.w    #$013A,D0
  945.         blt.b    SHuff1
  946. ; }
  947.         moveq    #0,D0           ; i=0
  948.         move.w    #N_CHAR*2,D4
  949.         move.w    #N_CHAR,D1    ; j=N_CHAR
  950.         movea.l A0,A1        ;freqp=freq
  951.         lea        2*N_CHAR+son,A2 ; sonp=&son[N_CHAR]
  952.         lea        prnt,A3     ; prntp=prnt
  953. ; while (j<=R) {
  954.         bra.b    SHuff4
  955. SHuff3: move.w    (A1)+,D2
  956.         add.w    (A1)+,D2
  957.         move.w    D1,D3
  958.         add.w    D3,D3
  959.         move.w    D2,0(A0,D3.w)    ; freq[j] = *freqp++ + *freqp++
  960.         move.w    D0,(A2)+    ; *sonp++=i
  961.         move.w    D4,(A3)+    ; *prntp++=j
  962.         move.w    D4,(A3)+    ; *prntp++=j
  963.         addq.w    #4,D0        ; i+=2
  964.         addq.w    #1,D1        ; j+=1
  965.         addq.w    #2,D4
  966. SHuff4: cmp.w    #R,D1
  967.         ble.b    SHuff3
  968. ; }
  969.         move.w    #$FFFF,$04E6(A0) ;freq[T]=0xffff
  970.         clr.w    2*R+prnt    ; prnt[R]=0
  971.         movem.l (SP)+,D3-D4/A2-A3
  972.         rts
  973.  
  974. ; -----------------------------------------------------------------------
  975. ;        Encode
  976. ; -----------------------------------------------------------------------
  977.  
  978. ; void Encode(void);
  979. ; register int i,r,s,c;
  980. ; register int len,last_match_length
  981. ; long printcount,printsize;
  982.  
  983. ; register D4 = c
  984. ; register D5 = s
  985. ; register D6 = r
  986. ; register A2 = *textsize
  987. ; 4(sp) = printcount;
  988. Encode: movem.l D3-D7/A2-A6,-(SP)
  989.         lea        -$0A(SP),SP
  990.  
  991.         move.l    lson(pc),A2
  992.         move.l    rson(pc),A3
  993.         move.l    dad(pc),A4
  994.  
  995.         move.l    textsize(pc),D0
  996.         beq        enc_23        ; if (textsize==0) return
  997.  
  998.         lea        text_buf,A5
  999.         moveq    #0,D1
  1000.         move.b    D1,putlen    ; putlen=0
  1001.         moveq    #0,D2
  1002.         move.b    D1,D2
  1003.         move.w    D2,putbuf    ; putbuf=0
  1004. ; printcount=textsize < blocksize ? textsize : blocksize
  1005.         move.l    D0,(SP)
  1006.         cmp.l    blocksize(pc),D0
  1007.         bge.b    enc_1
  1008.         bra.b    enc_2
  1009. enc_1:    move.l    blocksize(pc),D0
  1010. enc_2:    move.l    D0,4(SP)
  1011.         clr.l    textsize               ; textsize=0
  1012.  
  1013.         bsr        StartHuf
  1014.         bsr        InitTree
  1015.         moveq    #0,D5        ; s=0
  1016.         move.w    #N-F,D6     ; r=N-F
  1017.  
  1018. ; for(i=s; i<r;i++)
  1019.         move.w    D5,D7
  1020.         movem.l D0/A5,-(SP)
  1021.         add.w    d7,d7
  1022.         lea        0(A5,D7.w),A5
  1023.         lsr.w    #1,d7
  1024.         move.w    D6,D0
  1025.         sub.w    D7,D0
  1026.         sub.w    #1,D0
  1027. enc_4:    move.w    #$20,(A5)+    ; textbuf[i]=' '
  1028.         dbra    D0,enc_4
  1029.         movem.l (SP)+,D0/A5
  1030.  
  1031. ; for(len=0;len<F && (c=crc_getc(infile)) != EOF; len++)
  1032.         moveq    #0,D3
  1033.         pea        (a5)
  1034.         add.w    d6,d6
  1035.         lea        0(A5,D6.w),A5
  1036.         lsr.w    #1,d6
  1037.         bra.b    enc_6
  1038. enc_5:    addq.l    #1,a5
  1039.         move.b    D4,(A5)+    ; text_buf[r+len]=c
  1040.         addq.w    #1,D3        ; len++
  1041. enc_6:    cmp.w    #F,D3
  1042.         bge.b    enc_7
  1043.         getc
  1044.         bne.b    enc_7        ; Ist EOF
  1045.         crcgetc         ; c=crc_getc(infile)
  1046.         move.w    D0,D4
  1047.         bra.b    enc_5
  1048. ; end for
  1049. enc_7:    movea.l (SP)+,A5
  1050.         move.w    D3,D0
  1051.         ext.l    D0
  1052.         move.l    D0,textsize           ; textsize=len
  1053.  
  1054. ; for(i=1; i<=F; i++)
  1055.         moveq    #F-1,D7
  1056.         move.w    D6,-(SP)
  1057.         subq.w    #1,D6
  1058. enc_8:    add.w    d6,d6
  1059.         InsertNo    ; InsertNode(r-i)          ***
  1060.         lsr.w    d6
  1061.         subq.w    #1,D6
  1062. enc_9:    dbra    D7,enc_8
  1063.         move.w    (SP)+,D6
  1064.         add.w    d6,d6
  1065.         MatchInsertNo          ; InsertNode(r)           ***
  1066.         add.w    d5,d5
  1067. enc_10: lea        match_length(pc),A6
  1068.  
  1069.         cmp.w    (A6),D3
  1070.         bge.b    enc_11        ; if (match_length > len)
  1071.         move.w    D3,(A6)     ;    match_length=len
  1072. enc_11: move.b    putlen(pc),d7
  1073.         move.w    d6,d1
  1074.         move.w    d6,-(sp)
  1075.         move.w    putbuf(pc),d6
  1076.         cmpi.w    #2,(A6)
  1077.         bgt        enc_12        ; if match_length <=THRESHOLD
  1078.         move.w    #1,(A6)     ;    match_length=1
  1079.         moveq    #0,D0
  1080.         move.w    (A5,D1.w),D0
  1081.         EncodeCh    ; EncodeChar(text_buf[r])
  1082.         bra        enc_13
  1083. enc_12: move.w    (A6),D0
  1084.         add.w    #$FD,D0
  1085.         EncodeCh    ; EncodeChar(255-THRESHOLD+match_length)
  1086.         move.w    match_position(pc),D0
  1087.         lsr.w    #1,d0
  1088.         EncodePo    ; EncodePosition(match_position)
  1089. enc_13: move.b    d7,putlen
  1090.         move.w    d6,putbuf
  1091.         move.w    (sp)+,d6
  1092.         move.l    lson(pc),a2
  1093.         move.l    dad(pc),a4
  1094. ; for(i=0;i<last_match_length && (c=crc_getc(infile))!= EOF;i++)
  1095.         move.w    (a6),D0
  1096.  
  1097.         moveq.l #0,d4
  1098.         move.w    D0,D4
  1099.         add.l    D4,textsize
  1100.         lea        2*N(A5),A6
  1101.         dbra    d4,enc_14
  1102. enc_14a:subq.w    #1,d3
  1103.         bra        enc_15
  1104. enc_14b:InsertNo
  1105. enc_14: DeleteNo        ; DeleteNode(s)
  1106.         move.w    #2*$fff,d7
  1107.         getc
  1108.         bne        enc_14a     ; Ist EOF
  1109.         crcgetc         ; c=crc_getc(infile)
  1110.         move.w    d0,0(A5,D5.w)    ; text_buf[s]=c;
  1111.         cmp.w    #2*(F-1),D5
  1112.         bge.b    enc_15        ; if (s<F-1)
  1113.         move.w    d0,0(A6,D5.w)    ; text_buf[s+N]=c;
  1114. enc_15:
  1115.         addq.w    #2,D5
  1116.         and.w    d7,D5
  1117.         addq.w    #2,D6
  1118.         and.w    d7,D6
  1119. enc_16: dbra    d4,enc_14b
  1120.         MatchInsertNo
  1121. ; end for
  1122. ; if ((textsize +=i) >= printcount && i>0)
  1123. enc_17: tst.w    d3
  1124.         beq.b    enc_22
  1125.  
  1126.         move.l    textsize(pc),D1
  1127.         cmp.l    4(SP),D1
  1128.         blt        enc_10
  1129.  
  1130.         bsr        ProcInd
  1131. enc_18:    move.l    blocksize(pc),d0
  1132.         add.l    d0,4(SP)    ; printcount+=blocksize
  1133.         move.l    4(SP),D0
  1134.         cmp.l    (SP),D0
  1135.         ble        enc_10        ; if (printcount>printsize)
  1136.         move.l    (SP),4(SP)    ;    printcount=printsize
  1137.         bra        enc_10        ; while(len>0)
  1138.  
  1139. enc_22: move.b    putlen,d0
  1140.         beq.b    enc_23
  1141.  
  1142.         move.w    putbuf,d0
  1143.         lsr.w    #8,d0
  1144.         putc    d0
  1145.  
  1146. enc_23:    tst.b    buffered
  1147.         bne.b    enc_24
  1148.  
  1149.         bsr        shipout
  1150.  
  1151. enc_24:    lea        $0A(SP),SP
  1152.         movem.l (SP)+,D3-D7/A2-A6
  1153.         rts
  1154.  
  1155. ;**************************************************************************
  1156. ;**        Stuff for use with Decode                 **
  1157. ;**************************************************************************
  1158.  
  1159. ; -----------------------------------------------------------------------
  1160. ;        DecodeChar
  1161. ;  this is mixed with GetBit !
  1162. ; -----------------------------------------------------------------------
  1163.  
  1164.         macro    DecodeCh
  1165.         local    GBit
  1166.         local    GBit1
  1167.         local    GBit2
  1168.         local    GBit4
  1169.         local    GBit5
  1170.         local    DeC3
  1171.         local    DeC4
  1172.         local    DeC2
  1173.         move.w    2*R(A4),D1    ; C = son[R]
  1174.         move.l    #2*T,d2
  1175.         cmp.w    d2,D1        ;  while c < T
  1176.         bcc.b    DeC3
  1177.  
  1178. GBit:    dbra    d6,GBit4    ; keine Bits mehr da ?
  1179.         movea.l infile(pc),A0
  1180.         getw
  1181.         moveq    #15,d6
  1182.  
  1183. GBit4:    add.w    d7,d7        ; getbuf << 1 & if (getbuf>0)
  1184.         bge.b    GBit5
  1185.         addq.w    #2,d1        ; c+=getbit()
  1186. GBit5:                    ; getlen--
  1187.         move.w    0(A4,D1.w),D1    ; c=son[c]
  1188.  
  1189. DeC2:    cmp.w    d2,D1        ;  while c < T
  1190.         bcs.b    GBit
  1191. DeC3:    move.w    d1,d0
  1192.         sub.w    d2,D1        ; C -= T
  1193.         swap    d1
  1194.  
  1195.         update
  1196.         swap    d1
  1197.         move.w    d1,d0
  1198.         lsr.w    D0         ; Ausgleich für Arrays
  1199.         endm
  1200.  
  1201.  
  1202. ; -----------------------------------------------------------------------
  1203. ;        DecodePosition
  1204. ; -----------------------------------------------------------------------
  1205.  
  1206.         macro    DecodePo
  1207.         local    Dpos1
  1208.         local    Dpos2
  1209.         local    Dpos3
  1210.         local    D1Pos1
  1211.         local    D1Pos2
  1212.         local    Dnpos
  1213.         local    GetBit1
  1214.         local    GetBit2
  1215.         local    GetBit4
  1216.         local    GetBit5
  1217.         local    GetByte1
  1218.         local    GetByte2
  1219.         local    GetByte3
  1220.         local    GetByte4
  1221.         local    x
  1222.         moveq    #8,d4
  1223. ; while getlen<=8 {
  1224.         cmp.b    d4,d6
  1225.         bgt.b    GetByte4
  1226. GetByte1:
  1227. ;    i=getc(infile)
  1228.         movea.l infile(pc),A0
  1229.         rgetc
  1230. ;    getbuf |= i << 8 - getlen
  1231.         move.w    d4,D1;        d4=8
  1232.         sub.b    d6,D1
  1233.         lsl.w    D1,D0
  1234.         or.w    D0,d7
  1235. ;    getlen+=8
  1236.         add.b    d4,d6
  1237. GetByte4:
  1238. ; i=getbuf;
  1239.         and.l    #$ffff,d7
  1240.         lsl.l    #8,d7
  1241.         swap    d7
  1242.         sub.w    d4,d6
  1243.         lea        d_code(pc),A0
  1244.         moveq    #0,D4
  1245.         move.b    0(A0,D7.w),D4
  1246.         add.l    #d_len-d_code,a0
  1247.         moveq    #0,D2
  1248.         move.b    0(A0,D7.w),d2
  1249.         lsl.w    #6,D4
  1250.         swap    d7
  1251.         subq.w    #2,d2
  1252. Dpos1:    move.w    d6,d6        ; <8 bits availale?
  1253.         bgt.b    GetBit5      ; getlen = 0?
  1254.         movea.l infile(pc),A0
  1255.         getw
  1256.         moveq    #16,d6
  1257. GetBit5:move.w    d2,d0
  1258.         cmp.w    d6,d0
  1259.         blt.b    GetBit6
  1260.         move.w    d6,d0
  1261. GetBit6:lsl.l    d0,d7
  1262.         sub.w    d0,d6
  1263.         sub.w    d0,d2
  1264. Dpos2:    bne.b    Dpos1         ; nächstes bit
  1265.         swap    d7
  1266.         moveq    #$3f,d0
  1267.         and.w    d7,d0
  1268.         swap    d7
  1269. Dpos3:    or.w    D4,D0
  1270.         endm
  1271.  
  1272. ; -----------------------------------------------------------------------
  1273. ;        Decode
  1274. ; -----------------------------------------------------------------------
  1275.  
  1276. Decode: movem.l D3-D7/A2-A6,-(SP)
  1277.         subq.w    #6,SP
  1278.         bsr        OpenOut
  1279. ; if textsize == 0
  1280. ;     return
  1281.         move.l    textsize,D0
  1282.         beq        Dcode19
  1283. ; getlen = 0
  1284.         moveq    #0,D1
  1285.         move.b    D1,d6
  1286. ; getbuf = 0
  1287.         moveq    #0,D2
  1288.         move.b    D1,D2
  1289.         move.w    D2,d7
  1290. ; printcount=textsize<blocksize ? textsize | blocksize
  1291.         cmp.l    blocksize(pc),D0
  1292.         ble.b    Dcode1
  1293.         move.l    blocksize(pc),D0
  1294. Dcode1:    move.l    D0,(SP)
  1295. ; StartHuff()
  1296.         bsr        StartHuf
  1297. ; for (i=0; i<N-F;i++)
  1298.         moveq    #0,D4
  1299.         lea    text_buf,A5
  1300.         bra.b    Dcode5
  1301. Dcode4:
  1302. ;     text_buf[i] = ' '
  1303.         move.b    #$20,0(A5,D4.w)
  1304.         addq.w    #1,D4
  1305. Dcode5:
  1306.         cmp.w    #$0FC4,D4
  1307.         blt.b    Dcode4
  1308. ; r = N-F;
  1309.         move.w    #$0FC4,D5
  1310. ; for (count = 0; count < textsize;) {
  1311.         lea        crc,A6
  1312.         move.w    (A6)+,A3    ; A6 -> crctbl
  1313.         lea        son-crctbl(a6),a4
  1314.         lea        freq-crctbl(a6),a2
  1315.         clr.l    delen-son(a4)
  1316.         bra        Dcode16
  1317. Dcode6:
  1318. ;  c=DecodeCh()
  1319.         DecodeCh
  1320. ;  if (c<256) {
  1321.         cmp.w    #$0100,D0
  1322.         bge.b    Dcode8
  1323. ;       text_buf[r++]=c;
  1324.         move.b    D0,0(A5,D5.w)
  1325.         addq.w    #1,D5
  1326. ;      if (outfile != NULL)
  1327. ;         putc(c,outfile)
  1328.         fputc d0
  1329. Dcode7:
  1330. ;      setcrc(c)
  1331.         move.w    A3,D1
  1332.         eor.w    D0,D1
  1333.         and.w    #$FF,D1
  1334.         add.w    D1,D1
  1335.         move.w    A3,D2
  1336.         lsr.w    #8,D2
  1337.         move.w    0(A6,D1.w),D0
  1338.         eor.w    D2,D0
  1339.         move.w    D0,A3
  1340.  
  1341. ;       r & = (N-1)
  1342.         and.w    #$fff,D5
  1343. ;        count ++;
  1344.         addq.l    #1,delen-son(A4)
  1345. ; } else {
  1346.         bra    Dcode12
  1347. Dcode8:
  1348. ;      i= (r-DecodePosition()-1) & (N-1)
  1349.         move.w    d0,d3
  1350.         DecodePo
  1351.         move.w    D5,D4
  1352.         sub.w    D0,D4
  1353.         subq.w    #1,D4
  1354.         move.w    #$fff,d2
  1355.         and.w    d2,D4
  1356.  
  1357.         exg.l    d3,d4
  1358. ;      j = c - 255+THRESHOLD
  1359.         add.w    #$FF03-1,D4
  1360. ;      for (k=0; k<j; k++) {
  1361.  
  1362.         exg.l    a3,d6
  1363.         addq.l    #1,delen-son(A4)
  1364.         ext.l    d4
  1365.         add.l    d4,delen-son(a4)
  1366.         lea        outrec(pc),a0
  1367.         move.l    (a0)+,a1    ; len
  1368.  
  1369. Dcode9:
  1370. ;     c=text_buf[(i+k) & (N-1)]
  1371.         and.w    d2,D3
  1372.         move.b    0(A5,D3.w),D0
  1373. ;     text_buf[r++] = c;
  1374.         move.b    D0,0(A5,D5.w)
  1375.         addq.w    #1,D5
  1376. ;     r &=(N-1)
  1377.         and.w    d2,D5
  1378. ;     if (outfile!=NULL)
  1379. ;           putc(c,outfile)
  1380.  
  1381.         move.b    d0,(a1)+
  1382.         subq.l    #1,(a0)
  1383.         bpl.b    Dcode10
  1384. ; Hier shipout
  1385.         move.l    a1,outrec
  1386.         bsr        shipout
  1387.         lea        outrec(pc),a0
  1388.         move.l    (a0)+,a1    ; Memory
  1389. Dcode10:
  1390. ;     setcrc(c)
  1391.  
  1392.         move.w    d6,D1
  1393.         eor.b    D0,D6
  1394.         and.w    #$FF,D6
  1395.         add.w    D6,D6
  1396.         lsr.w    #8,D1
  1397.         move.w    0(A6,D6.w),D6
  1398.         eor.w    D1,D6
  1399. ;     count++;
  1400. ;    }
  1401.         addq.w    #1,D3
  1402.  
  1403. Dcode11:
  1404.         dbra    d4,Dcode9
  1405.         move.l    a1,outrec
  1406.         exg.l    a3,d6
  1407. Dcode12:
  1408. ;    if (count >= printcount) {
  1409.         move.l    delen-son(a4),d0
  1410.         cmp.l    (SP),d0
  1411.         bcs.b    Dcode16a
  1412.  
  1413.         bsr        ProcInd
  1414. Dcode13:
  1415. ;     printcount +=blocksize;
  1416.         move.l    blocksize(pc),D0
  1417.         add.l    D0,(SP)
  1418. ;     if (printcount > textsize)
  1419.         move.l    (SP),D1
  1420.         cmp.l    textsize(pc),D1
  1421.         ble.b    Dcode14
  1422. ;    printcount = textsize);
  1423.         move.l    textsize(pc),(SP)
  1424. Dcode14:
  1425. ;    if (outfile != NULL && ferror(outfile))
  1426.         move.l    outfile(pc),D0
  1427.         beq.b    Dcode16
  1428.         ferror    D0
  1429.  
  1430. Dcode15:bne.b    Dcode17
  1431. Dcode16:move.l    delen-son(a4),d0
  1432. Dcode16a:
  1433.         cmp.l    textsize(pc),D0
  1434.         bcs    Dcode6
  1435. Dcode17:
  1436.         bsr        ProcInd
  1437. Dcode18:
  1438. ;     if (outfile != NULL && ferror(outfile) {
  1439.         move.l    outfile(pc),D0
  1440.         beq.b    Dcode19
  1441.         ferror    D0
  1442.         beq.b    Dcode19
  1443. ;        error(WTERR,outfile)
  1444.         movea.l outfname,A0
  1445.         moveq.l    #WTERR,D0
  1446.         moveq.l    #-1,D1
  1447.         bra        error
  1448.  
  1449. Dcode19:move.w    a3,-(a6)    ; crc
  1450.         addq.w    #6,SP
  1451.         bsr        shipout
  1452.         movem.l (SP)+,D3-D7/A2-A6
  1453.         rts
  1454.  
  1455. DeleteONode:    movem.l D0-A6,-(SP)
  1456.                 move.l     lson(pc),A2
  1457.                 move.l     rson(pc),A3
  1458.                 move.w    D0,D5
  1459.                 move.w    #2*NIL,D7
  1460.                 move.l    dad(pc),A0
  1461.                 add.w    D5,D5
  1462. ; if dad[p] == NIL
  1463.                 cmp.w    0(A0,D5.w),D7
  1464.                 beq.b    DNode_9
  1465. ; if rson[p] == NIL
  1466.                 cmp.w    0(A3,D5.w),D7
  1467.                 beq.b    DNodex1
  1468.  
  1469. ; if lson[p] == NIL
  1470. DNode_1:        cmp.w    0(A2,D5.w),D7
  1471.                 beq.b    DNodex2
  1472.  
  1473. DNode_2:        lea     0(A2,D5.w),A4    ; lson[p]
  1474.                 lea     0(A3,D5.w),A5    ; rson[p]
  1475.                 move.w    (A4),D1
  1476.  
  1477.                 move.w    D1,D2
  1478.                 cmp.w    0(A3,D2.w),D7
  1479.                 beq.b    DNode_5
  1480. ; do { q=rson[q] } while (rson[q] != NIL}
  1481.  
  1482. DNode_3:        move.w    0(A3,D2.w),D2
  1483.                 cmp.w    D7,D2
  1484.                 beq.b    DNode_4
  1485.                 move.w    D2,D1
  1486.                 bra.b    DNode_3
  1487.  
  1488. DNode_4:        move.w    D1,D2
  1489.                 move.w    0(A0,D2.w),D3
  1490.                 lea     0(A2,D2.w),A1    ; rson[q]
  1491.                 move.w    (A1),0(A3,D3.w) ; lson[dad[q]] = rson[q]
  1492.                 move.w    (A1),D3
  1493.                 move.w    0(A0,D2.w),0(A0,D3.w) ; dad[rson[q]]=dad[q[
  1494.                 move.w    (A4),D3
  1495.                 move.w    D3,(A1)         ; rson[q]=rson[p]
  1496.                 move.w    D1,0(A0,D3.w)
  1497. DNode_5:        move.w    (A5),D3
  1498.                 move.w    D3,0(A3,D2.w)    ; rson[q] = rson[p]
  1499.                 move.w    D1,0(A0,D3.w)    ; dad[rson[p]] = q
  1500. DNode_6:        move.w    0(A0,D5.w),0(A0,D1.w) ; dad[q]=dad[p]
  1501.  
  1502.                 lea     0(A0,D5.w),A5    ; A5=*dad[p]
  1503.                 move.w    (A5),D3         ; D3 = cardinal dad[p]
  1504.                 cmp.w    0(A3,D3.w),D5
  1505.                 bne.b    DNode_7         ; if rson[dad[p]]=p
  1506. ; else ..
  1507.                 move.w    D1,0(A3,D3.w)    ; rson[dad[p]]=q
  1508.                 move.w    D7,(A5)
  1509.                 movem.l (SP)+,D0-A6
  1510.                 rts
  1511. ; if ..
  1512. DNode_7:        move.w    D1,0(A2,D3.w)    ; lson[dad[p]]=q
  1513. ; endif ..
  1514. DNode_8:        move.w    D7,(A5)         ; dad[p]=NIL
  1515. DNode_9:        movem.l (SP)+,D0-A6
  1516.                 rts
  1517. DNodex2:        move.w    0(A3,D5.w),D1
  1518.                 bra.b    DNode_6
  1519. DNodex1:        move.w    0(A2,D5.w),D1
  1520.                 bra.b    DNode_6
  1521.  
  1522. ; void InsertNode(int r);
  1523. ; rester int i,p,cmp;
  1524. ; unsigned char *key;
  1525. ; unigned c;
  1526.  
  1527. ; register D1 = cmp
  1528. ; register D2 = p
  1529. ; register A1 = *key
  1530. ; register A2 = rson
  1531. ; register A3 = lson
  1532.  
  1533. ; D0 = cardinal p
  1534.  
  1535. ; Benötigt: A0 = text_buf
  1536. ;            A2 = lson
  1537. ;            A3 = rson
  1538. ;            A4 = dad
  1539.  
  1540. InsertONode:    movem.l D0-A6,-(SP)
  1541.                 move.l    lson(pc),A2
  1542.                 move.l     rson(pc),A3
  1543.                 lea     text_buf,a5
  1544.  
  1545.                 move.w    D0,D6
  1546.                 moveq    #1,D1            ; cmp=1
  1547.  
  1548.                 lea     0(A5,D6.w),A1    ; key=&text_buf[r]
  1549.                 add.w    D6,D6
  1550.  
  1551.                 moveq    #0,D2
  1552.                 move.b    (A1),D2         ; key[0]
  1553.                 add.w    #4097,D2        ; p= N+1+key[0]
  1554.                 add.w    D2,D2            ; cardinal
  1555.  
  1556.                 move.w    #2*NIL,D7        ; NIL
  1557.                 move.w    D7,0(A2,D6.w)    ; rson[r] = NIL
  1558.                 move.w    D7,0(A3,D6.w)    ; lson[r] = NIL
  1559.  
  1560.                 clr.w    match_length    ; match_length=0
  1561. ; for ...
  1562.                 move.l    dad(pc),A4
  1563. I_Node1:        tst.w    D1                ; if (cmp > 0) {
  1564.                 blt.b    I_Node4
  1565.                 lea     0(A3,D2.w),A6    ; rson[p]
  1566.                 cmp.w    (A6),D7         ; if rson[p] != NIL
  1567.                 bne.b    I_Node5         ; p=rson[p] else
  1568.  
  1569. I_Node2:        move.w    D6,(A6)         ; rson[p] = r
  1570.                 move.w    D2,0(A4,D6.w)    ; dad[r] = p
  1571.                 bra     I_Node11
  1572.  
  1573. I_Node3:        move.w    D6,(A6)         ; lson[p] = r
  1574.                 move.w    D2,0(A4,D6.w)    ; dad[r] = p
  1575.                 bra     I_Node11
  1576.  
  1577. I_Node4:        lea     0(A2,D2.w),A6    ; d7=lson[p]
  1578.                 cmp.w    (A6),D7         ; if lson[p] != NIL
  1579.                 beq.b    I_Node3
  1580.  
  1581. ; for (i=1; i<F; i++)
  1582. I_Node5:        move.w    (A6),D2
  1583.                 moveq    #0,D1
  1584.                 moveq    #FOLD-2,D5
  1585.                 lea     1(A1),A0        ; key[1]
  1586.                 lsr.w    #1,D2
  1587.                 lea     1(A5,D2.w),A6    ; text_buf[p+1]
  1588.                 add.w    D2,D2
  1589. I_Node6:        cmpm.b    (A0)+,(A6)+
  1590.                 dbne    D5,I_Node6
  1591.  
  1592. I_Node7:        moveq    #FOLD-1,D3
  1593.                 sub.w    D5,D3
  1594.                 moveq    #0,D5
  1595.                 move.b    -1(A0),D1
  1596.                 move.b    -1(A6),D5
  1597.                 sub.w    D5,D1            ; d1=key[i]-text_buf[p+i]
  1598.  
  1599.                 lea     match_length,A6
  1600.                 cmp.w    (A6),D3         ; if i>match_length
  1601.                 ble.b    I_Node1
  1602.  
  1603.                 move.w    D2,D4
  1604.                 lsr.w    #1,D4
  1605.                 move.w    D4,match_position
  1606.  
  1607.                 move.w    D3,(A6)         ; match_length=i
  1608.                 cmp.w    #FOLD,D3        ; if i>=F
  1609.                 blt.b    I_Node1         ; break
  1610.  
  1611. I_Node8:        move.w    0(A4,D2.w),0(A4,D6.w) ; dad[r] = dad[p]
  1612.                 move.w    0(A2,D2.w),0(A2,D6.w) ; lson[r] = lson[p]
  1613.                 move.w    0(A3,D2.w),0(A3,D6.w) ; rson[r] = rson[p[
  1614.  
  1615.                 move.w    0(A2,D2.w),D4
  1616.                 move.w    D6,0(A4,D4.w)    ; dad[lson[p]]=r
  1617.  
  1618.                 move.w    0(A3,D2.w),D4
  1619.                 move.w    D6,0(A4,D4.w)    ; dad[rson[p]]=r
  1620.  
  1621.                 lea     0(A4,D2.w),A6
  1622.                 move.w    (A6),D4         ; a6 = *dat[p]
  1623.                 cmp.w    0(A3,D4.w),D2
  1624.                 beq.b    I_Node12
  1625.  
  1626. I_Node9:        move.w    (A6),D3
  1627.                 move.w    D6,0(A2,D3.w)    ; lson[dad[p]] = r
  1628.  
  1629. I_Node10:        move.w    D7,(A6)         ; dad[p] = NIL
  1630. I_Node11:        movem.l (SP)+,D0-A6
  1631.                 rts
  1632.  
  1633. I_Node12:        move.w    D6,0(A3,D4.w)
  1634.                 move.w    D7,(A6)         ; dad[p] = NIL
  1635.                 movem.l (SP)+,D0-A6
  1636.                 rts
  1637.  
  1638. putbuf:     ds.w    1
  1639. putlen:     ds.b    1
  1640.  
  1641.             even
  1642.  
  1643. outfile:    ds.l    1
  1644. infile:     ds.l    1
  1645. blocksize:    ds.l    1
  1646. lson:        ds.l    1
  1647. rson:        ds.l    1
  1648. dad:        ds.l    1
  1649. textsize:    ds.l    1
  1650. match_position:
  1651.             ds.w    1
  1652. match_length:
  1653.             ds.w    1
  1654. codesize:    ds.l    1
  1655. getbuf:     ds.w    1
  1656. getlen:     ds.b    1
  1657.  
  1658. p_len:
  1659.     dc.b    $03, $04, $04, $04, $05, $05, $05, $05
  1660.     dc.b    $05, $05, $05, $05, $06, $06, $06, $06
  1661.     dc.b    $06, $06, $06, $06, $06, $06, $06, $06
  1662.     dc.b    $07, $07, $07, $07, $07, $07, $07, $07
  1663.     dc.b    $07, $07, $07, $07, $07, $07, $07, $07
  1664.     dc.b    $07, $07, $07, $07, $07, $07, $07, $07
  1665.     dc.b    $08, $08, $08, $08, $08, $08, $08, $08
  1666.     dc.b    $08, $08, $08, $08, $08, $08, $08, $08
  1667.  
  1668. p_code:
  1669.     dc.b    $00, $20, $30, $40, $50, $58, $60, $68
  1670.     dc.b    $70, $78, $80, $88, $90, $94, $98, $9C
  1671.     dc.b    $A0, $A4, $A8, $AC, $B0, $B4, $B8, $BC
  1672.     dc.b    $C0, $C2, $C4, $C6, $C8, $CA, $CC, $CE
  1673.     dc.b    $D0, $D2, $D4, $D6, $D8, $DA, $DC, $DE
  1674.     dc.b    $E0, $E2, $E4, $E6, $E8, $EA, $EC, $EE
  1675.     dc.b    $F0, $F1, $F2, $F3, $F4, $F5, $F6, $F7
  1676.     dc.b    $F8, $F9, $FA, $FB, $FC, $FD, $FE, $FF
  1677.  
  1678. d_code:
  1679.     dc.b    $00, $00, $00, $00, $00, $00, $00, $00
  1680.     dc.b    $00, $00, $00, $00, $00, $00, $00, $00
  1681.     dc.b    $00, $00, $00, $00, $00, $00, $00, $00
  1682.     dc.b    $00, $00, $00, $00, $00, $00, $00, $00
  1683.     dc.b    $01, $01, $01, $01, $01, $01, $01, $01
  1684.     dc.b    $01, $01, $01, $01, $01, $01, $01, $01
  1685.     dc.b    $02, $02, $02, $02, $02, $02, $02, $02
  1686.     dc.b    $02, $02, $02, $02, $02, $02, $02, $02
  1687.     dc.b    $03, $03, $03, $03, $03, $03, $03, $03
  1688.     dc.b    $03, $03, $03, $03, $03, $03, $03, $03
  1689.     dc.b    $04, $04, $04, $04, $04, $04, $04, $04
  1690.     dc.b    $05, $05, $05, $05, $05, $05, $05, $05
  1691.     dc.b    $06, $06, $06, $06, $06, $06, $06, $06
  1692.     dc.b    $07, $07, $07, $07, $07, $07, $07, $07
  1693.     dc.b    $08, $08, $08, $08, $08, $08, $08, $08
  1694.     dc.b    $09, $09, $09, $09, $09, $09, $09, $09
  1695.     dc.b    $0A, $0A, $0A, $0A, $0A, $0A, $0A, $0A
  1696.     dc.b    $0B, $0B, $0B, $0B, $0B, $0B, $0B, $0B
  1697.     dc.b    $0C, $0C, $0C, $0C, $0D, $0D, $0D, $0D
  1698.     dc.b    $0E, $0E, $0E, $0E, $0F, $0F, $0F, $0F
  1699.     dc.b    $10, $10, $10, $10, $11, $11, $11, $11
  1700.     dc.b    $12, $12, $12, $12, $13, $13, $13, $13
  1701.     dc.b    $14, $14, $14, $14, $15, $15, $15, $15
  1702.     dc.b    $16, $16, $16, $16, $17, $17, $17, $17
  1703.     dc.b    $18, $18, $19, $19, $1A, $1A, $1B, $1B
  1704.     dc.b    $1C, $1C, $1D, $1D, $1E, $1E, $1F, $1F
  1705.     dc.b    $20, $20, $21, $21, $22, $22, $23, $23
  1706.     dc.b    $24, $24, $25, $25, $26, $26, $27, $27
  1707.     dc.b    $28, $28, $29, $29, $2A, $2A, $2B, $2B
  1708.     dc.b    $2C, $2C, $2D, $2D, $2E, $2E, $2F, $2F
  1709.     dc.b    $30, $31, $32, $33, $34, $35, $36, $37
  1710.     dc.b    $38, $39, $3A, $3B, $3C, $3D, $3E, $3F
  1711.  
  1712. d_len:
  1713.     dc.b    $03, $03, $03, $03, $03, $03, $03, $03
  1714.     dc.b    $03, $03, $03, $03, $03, $03, $03, $03
  1715.     dc.b    $03, $03, $03, $03, $03, $03, $03, $03
  1716.     dc.b    $03, $03, $03, $03, $03, $03, $03, $03
  1717.     dc.b    $04, $04, $04, $04, $04, $04, $04, $04
  1718.     dc.b    $04, $04, $04, $04, $04, $04, $04, $04
  1719.     dc.b    $04, $04, $04, $04, $04, $04, $04, $04
  1720.     dc.b    $04, $04, $04, $04, $04, $04, $04, $04
  1721.     dc.b    $04, $04, $04, $04, $04, $04, $04, $04
  1722.     dc.b    $04, $04, $04, $04, $04, $04, $04, $04
  1723.     dc.b    $05, $05, $05, $05, $05, $05, $05, $05
  1724.     dc.b    $05, $05, $05, $05, $05, $05, $05, $05
  1725.     dc.b    $05, $05, $05, $05, $05, $05, $05, $05
  1726.     dc.b    $05, $05, $05, $05, $05, $05, $05, $05
  1727.     dc.b    $05, $05, $05, $05, $05, $05, $05, $05
  1728.     dc.b    $05, $05, $05, $05, $05, $05, $05, $05
  1729.     dc.b    $05, $05, $05, $05, $05, $05, $05, $05
  1730.     dc.b    $05, $05, $05, $05, $05, $05, $05, $05
  1731.     dc.b    $06, $06, $06, $06, $06, $06, $06, $06
  1732.     dc.b    $06, $06, $06, $06, $06, $06, $06, $06
  1733.     dc.b    $06, $06, $06, $06, $06, $06, $06, $06
  1734.     dc.b    $06, $06, $06, $06, $06, $06, $06, $06
  1735.     dc.b    $06, $06, $06, $06, $06, $06, $06, $06
  1736.     dc.b    $06, $06, $06, $06, $06, $06, $06, $06
  1737.     dc.b    $07, $07, $07, $07, $07, $07, $07, $07
  1738.     dc.b    $07, $07, $07, $07, $07, $07, $07, $07
  1739.     dc.b    $07, $07, $07, $07, $07, $07, $07, $07
  1740.     dc.b    $07, $07, $07, $07, $07, $07, $07, $07
  1741.     dc.b    $07, $07, $07, $07, $07, $07, $07, $07
  1742.     dc.b    $07, $07, $07, $07, $07, $07, $07, $07
  1743.     dc.b    $08, $08, $08, $08, $08, $08, $08, $08
  1744.     dc.b    $08, $08, $08, $08, $08, $08, $08, $08
  1745.  
  1746.             bss
  1747.  
  1748. crc:        ds.w    1    ; Reihenfolge !
  1749. crctbl:     ds.w    256
  1750. delen:        ds.l    1
  1751. freq:        ds.w    T+1
  1752. prnt:        ds.w    T+N_CHAR
  1753. son:        ds.w    T
  1754.  
  1755.             align    16
  1756.  
  1757. text_buf:    ds.b    BUFSIZ
  1758.  
  1759.             even
  1760.             end
  1761.